package com.maven.springaop.demos.proxy;


import net.sf.cglib.proxy.Enhancer;

public class Main {
    public static void main(String[] args) {
        // 静态代理:
        // 不方便，当业主需要添加业务（接口类定义新的方法的时候）
        // 代理类和目标类都要 重写，过于麻烦
        HouseObject houseObject=new RealHouseObject();
/*        ProxyHouseObject proxyHouseObject=new ProxyHouseObject(houseObject);
        proxyHouseObject.sellHouse();
        proxyHouseObject.rentHouse();*/


        // 因此，就产生了 动态代理的想法
        // 动态代理： JDK动态代理  ， CGlib 动态代理

        // JDK 动态 : 有局限性
        // 由于我们在 动态创建 代理的时候使用的 是Proxy.newProxyInstance（）方法
        // 这个方法的参数要求 有 接口类
/*        HouseObject proxy = (HouseObject) Proxy.newProxyInstance(
                houseObject.getClass().getClassLoader(),
                new Class[]{HouseObject.class},
                new JDKInvocationHandler(houseObject)
        );
        proxy.sellHouse();
        proxy.rentHouse();*/

        // CGlib 实现代理
        // 下述代码存在些许问题，可能由于 jdk版本的原因
/*        HouseObject target= new RealHouseObject();
        HouseObject proxy= (HouseObject) Enhancer.create(target.getClass(),new CGLIBInterceptor(target));
        proxy.rentHouse();*/



        // Spring AOP 是 两者都实现了
        // 如果没有实现 接口，SpringAOP 使用 cglib  ， 有接口，两者均可
        // 这取决与  属性 proxyTargetClass
        // 当  proxyTargetClass 为 true，使用 cglib
        // 当  proxyTargetClass 为 false，实现了接口类用 jdk，反之则用 cglib


    }
}
